package com.gitee.deament.server.core.cli.db.set;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * SPOP key
 * 可用版本： >= 1.0.0
 * 时间复杂度: O(1)
 * 移除并返回集合中的一个随机元素。
 * <p>
 * 如果只想获取一个随机元素，但不想该元素从集合中被移除的话，可以使用 SRANDMEMBER key [count] 命令。
 * <p>
 * 返回值
 * 被移除的随机元素。 当 key 不存在或 key 是空集时，返回 nil 。
 *
 * @author deament
 */
@CliHander(command = "SPOP")
public class SPOPcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> cliValues = getValues(command);
        if (cliValues.size() != 3) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'SISMEMBER' command"));
            return;
        }
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        DBData dbData = SystemConfig.dbData;
        String key = cliValues.get(1);
        try {
            Value<Set<String>> set = dbData.getSet(db, key);
            if (set == null || set.getValue().size() == 0) {
                channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("nil"));
                return;
            }
            Iterator<String> iterator = set.getValue().iterator();
            if (iterator.hasNext()) {
                String next = iterator.next();

                set.getValue().remove(next);
                channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(next));
                return;
            }


        } catch (Exception e) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(e.getMessage()));
        }

    }
}
